import os
import traceback
import subprocess
from moviepy.video.io.VideoFileClip import VideoFileClip
from moviepy import concatenate_videoclips
from moviepy.video.fx import TimeMirror


# 注意：如果D盘上的视频文件不存在，建议使用本地temp目录中的视频文件
# 原始路径 (可能不存在):
video_path = 'D:/36871_new.mp4'
# 
# 建议使用的本地测试路径 (使用temp目录中的视频文件):
#video_path = os.path.join('temp', 'video_3e4e0a96-dd02-4ffe-8671-91c81a690d61.mp4')
# 或者使用绝对路径:
# video_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'temp', 'video_3e4e0a96-dd02-4ffe-8671-91c81a690d61.mp4')

# 初始化视频变量
video = None
opencv_success = False  # 标记是否使用OpenCV成功处理了视频

# 添加文件存在性检查
if not os.path.exists(video_path):
    print(f"错误：视频文件不存在 - {video_path}")
    exit(1)

# 检查文件大小是否合理
file_size = os.path.getsize(video_path)
if file_size < 1024:  # 文件大小小于1KB，可能是无效文件
    print(f"错误：视频文件太小，可能是无效文件: {video_path}, 大小: {file_size} 字节")
    exit(1)

# 首先尝试使用已存在的转码文件
video = None

try:
    video = VideoFileClip(
        video_path,
        audio=False  # 禁用音频
    )

    # 尝试读取第一帧以验证视频的有效性
    first_frame = video.get_frame(0)

    print(f"成功以标准方式打开视频: {video_path}")
except Exception as e:
    print(f"标准方式无法打开视频文件: {video_path}, 错误: {str(e)}")
    video = None

# 如果成功打开视频，继续处理
if video is not None:
    try:
        video_clips = []
        video_clips.append(video)

        # 只有在不是通过OpenCV处理的情况下才尝试创建反转视频
        # 因为OpenCV创建的VideoClip对象可能不支持所有MoviePy操作
        if not opencv_success:
            print("尝试创建反转视频...")
            reversed_clip = video.with_effects([TimeMirror()])
            video_clips.append(reversed_clip)
            print("成功创建反转视频")
        else:
            print("使用OpenCV处理的视频，跳过反转视频创建")

        print("视频处理准备就绪")
        
        # 在这里可以添加后续处理代码
        # 例如：final_clip = concatenate_videoclips(video_clips)
        #       final_clip.write_videofile(...)等
        
    except Exception as e:
        print(f"视频处理过程中出错: {str(e)}")
        print(f"错误详情:\n{traceback.format_exc()}")
    finally:
        # 清理资源
        if video is not None:
            try:
                video.close()
            except:
                pass
        # 清理其他可能的资源
        if 'reversed_clip' in locals():
            try:
                reversed_clip.close()
            except:
                pass
